# -*- coding:UTF-8 -*-

"""
这是servie端的主程序，包含web服务器，加/解密操作
"""

import tornado.web
import tornado.ioloop
import tornado.gen
import seccure
import urllib2
import urllib
import os
import dbopt
import time
import hashlib

settings = {
    "static_path":os.path.join(os.path.dirname(__file__), "static"),
    "cookie_secret": "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
    "login_url": "/",

}  #设置服务端静态文件地址，cookie_secret，默认地址等信息



class postor():                   #用于与一次性口令端通信的类
    def __init__(self,address,data):             #初始化通信地址和数据
        self.value = urllib.urlencode(data)
        self.req = urllib2.Request(address,self.value)

    def post_data(self):#提交通信数据
        res = urllib2.urlopen(self.req)
        return res

def post_m(address,data):#通信用函数，用于创建新进程进行通信，保障程序不被通信阻塞
    post = postor(address,data)
    post.post_data()
    exit(0)

class LoginHandler(tornado.web.RequestHandler):#登录用句柄，为登录提供后台服务
    @tornado.gen.engine
    @tornado.web.asynchronous
    def get(self):#在当前句柄中，得到ｇｅｔ请求后的操作，后面的get函数同样效果
        self.render("static/html/index.html")#操作内容，显示参数路径中的网页
        print self.request.headers

    @tornado.gen.engine
    @tornado.web.asynchronous
    def post(self):#在当前句柄中，得到ｐｏｓｔ请求后的操作
        username = self.get_argument("username")#获取ｐｏｓｔ中的ｕｓｅｒｎａｍｅ数据
        password = self.get_argument("password")#password数据
        db = dbopt.db_class()#数据库操作初始化
        cu = db.get_password(username)#获得数据库中该用户的密码
        dict = cu.next()
        print dict
        if(password==dict['password']):   #比对密码
            self.set_secure_cookie("user",username,expires=time.time()+900) #设置cookie,以及周期
            if (self.request.remote_ip == "::1"):#获取客户端ｉｐ
                ip = "127.0.0.1"
            else:
                ip = self.request.remote_ip
            s = "hello"
            sig = seccure.sign(s, dbopt.test_pr_key)#签名
            name = username
            data = {"s": s, "sig": sig, "ip": ip, "name": name}#打包数据以及签名
            post = postor("http://127.0.0.1:8088/", data)#发送给口令端
            print data
            res = post.post_data()#发送给口令端
            string = res.read()#获取口令端返回的一次性密钥
            print string
            self.set_secure_cookie("passstring",urllib.quote(string.decode("base64")))
            self.redirect("/check")#进入认证一次性密钥网页
        else:
            self.redirect("/")

class CheckHandler(tornado.web.RequestHandler):#认证一次性密钥的网页后台句柄
    def get_current_user(self):
        return self.get_secure_cookie("user")
    @tornado.gen.engine
    @tornado.web.asynchronous#设置异步防止因为数据库问题卡死
    @tornado.web.authenticated#设置必须登录才能访问
    def get(self):
        if(self.current_user!=None):
            print self.current_user
            self.render("static/html/check.html",user=self.current_user,ip=self.request.remote_ip)#获得当前用户，显示认证页面
    @tornado.gen.engine
    @tornado.web.asynchronous
    def post(self):
        chiper = self.get_argument("password")#获得用户提交的一次性口令
        print chiper
        if(chiper == seccure.decrypt(urllib.unquote(self.get_secure_cookie("passstring")),dbopt.test_pr_key)):#比对双方获得的一次性口令，这里用服务器私钥解密了一次性口令
            self.set_secure_cookie("c_user",self.current_user+chiper,expires=time.time()+900)#设置当前正确登录的用户cookie
            self.redirect("/manage")#成功则进入管理页面
        else:
            self.redirect("/")#失败就返回登录页面

class ManageHandler(tornado.web.RequestHandler):#管理页面后台句柄
    def get_current_user(self):
        return self.get_secure_cookie("c_user")
    @tornado.gen.engine
    @tornado.web.asynchronous
    @tornado.web.authenticated
    def get(self):
        if(self.current_user==self.get_secure_cookie("user")+seccure.decrypt(urllib.unquote(self.get_secure_cookie("passstring")),dbopt.test_pr_key)):#验证当前用户
            db = dbopt.db_class()
            power = db.get_uesr_power(self.get_secure_cookie("user"))
            cu = power.next()#获取当前用户的权限
            print cu
            if(cu["power"] == "SM"):#根据不同权限显示不同页面
                self.render("static/html/manage.html", user=self.get_secure_cookie("user"),user_list=db.get_all_user_power())
            else:
                self.render("static/html/seccess.html", user=self.get_secure_cookie("user"))
    @tornado.gen.engine
    @tornado.web.asynchronous
    @tornado.web.authenticated
    def post(self):
        db = dbopt.db_class()
        username = self.get_argument("t_user")
        power = self.get_argument("power")
        if(power == "del"):#删除操作
            po = db.get_uesr_power(username)
            dict = po.next()
            if(dict["power"]!="SM"):
                ret = db.del_user(username)
            else:
                ret = 0
            if(ret == 1):
                self.write("<h1>删除成功</h1>")
                self.redirect("/manage")
            else:
                self.write("<h1>删除失败</h1>")
                self.redirect("/manage")
        elif(power == "M" or power == "SM"):#修改权限操作
            db.change_power(username,power)
            self.write("<h1>操作完成</h1>")
            self.redirect("/manage")
        else:
            self.write(" <h1>操作码错误</h1>")
            self.redirect("/manage")

class AddHandler(tornado.web.RequestHandler):#注册用户时用于接受用户的账号密码
    @tornado.gen.engine
    @tornado.web.asynchronous
    def post(self):
        username = self.get_argument("username")
        password = self.get_argument("password")
        power = self.get_argument("power")
        db = dbopt.db_class()
        res = db.add_user(username,password,power)
        print res
        self.finish()

application = tornado.web.Application([(r"/",LoginHandler),
                                       (r'/check',CheckHandler),
                                       (r'/manage', ManageHandler),
                                       (r'/add',AddHandler),
                                       ],**settings)#网站后台设置

if __name__ == '__main__':
    application.listen(8081)#开启端口监听
    tornado.ioloop.IOLoop.instance().start()#开启监听循环